PythonãšOpenGLã·ã§ãŒããŒã§3Dã°ã©ãã£ãã¯ã¹ã®äžçãæ¢æ±ããŸããããé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒãGLSLã«ã€ããŠåŠã³ãçŽ æŽãããèŠèŠå¹æãäœæããæ¹æ³ãåŠã³ãŸãã
Python 3Dã°ã©ãã£ãã¯ã¹ïŒOpenGLã·ã§ãŒããŒããã°ã©ãã³ã°ã®è©³çް
ãã®å æ¬çãªã¬ã€ãã§ã¯ãPythonãšOpenGLãçšãã3Dã°ã©ãã£ãã¯ã¹ããã°ã©ãã³ã°ã®é åçãªé åãæãäžããç¹ã«ã·ã§ãŒããŒã®åãšæè»æ§ã«çŠç¹ãåœãŠãŸããçµéšè±å¯ãªéçºè ã§ãã奜å¥å¿æºçãªåå¿è ã§ãããã®èšäºã¯çŽ æŽãããèŠèŠå¹æãã€ã³ã¿ã©ã¯ãã£ããª3Däœéšãäœæããããã®ç¥èãšå®è·µçãªã¹ãã«ãç¿åŸããã®ã«åœ¹ç«ã¡ãŸãã
OpenGLãšã¯ïŒ
OpenGL (Open Graphics Library) ã¯ã2Dããã³3Dãã¯ãã«ã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®ãèšèªéäŸåããã©ãããã©ãŒã éäŸåã®APIã§ãããããªã²ãŒã ãCADãœãããŠã§ã¢ãç§åŠçèŠèŠåãªã©ãå¹ åºãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããã匷åãªããŒã«ã§ããOpenGLã¯ãã°ã©ãã£ãã¯ã¹åŠçãŠããã (GPU) ãšå¯Ÿè©±ããããã®æšæºåãããã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããéçºè ãèŠèŠçã«è±ãã§é«æ§èœãªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããããã«ããŸãã
OpenGLã«Pythonã䜿çšããçç±
OpenGLã¯äž»ã«C/C++ APIã§ãããPythonã¯PyOpenGLã®ãããªã©ã€ãã©ãªãéããŠãOpenGLã䟿å©ãã€ã¢ã¯ã»ã¹ããããæ¹æ³ã§å©çšã§ããŸããPythonã®å¯èªæ§ãšäœ¿ããããã«ããã3Dã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã®ãããã¿ã€ãã³ã°ãå®éšãããã³è¿ éãªéçºã«æé©ãªéžæè¢ãšãªããŸããPyOpenGLã¯ããªããžãšããŠæ©èœããäœ¿ãæ £ããPythonç°å¢å ã§OpenGLã®åãæŽ»çšã§ããããã«ããŸãã
ã·ã§ãŒããŒã®ç޹ä»ïŒèŠèŠå¹æã®éµ
ã·ã§ãŒããŒã¯ãGPUäžã§çŽæ¥å®è¡ãããå°ããªããã°ã©ã ã§ãããããã¯ãé ç¹ã倿ããã³è²ä»ããã (é ç¹ã·ã§ãŒããŒ) ã ãã§ãªããåãã¯ã»ã«ã®æçµçãªè²ã決å®ãã (ãã©ã°ã¡ã³ãã·ã§ãŒããŒ) 圹å²ãæ ããŸããã·ã§ãŒããŒã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãæ¯é¡ãªãå¶åŸ¡ã§ããã«ã¹ã¿ã ã©ã€ãã£ã³ã°ã¢ãã«ãé«åºŠãªãã¯ã¹ãã£ãªã³ã°å¹æãããã³åºå®æ©èœOpenGLã§ã¯å®çŸäžå¯èœãªå¹ åºãèŠèŠã¹ã¿ã€ã«ãäœæã§ããŸãã
ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãçè§£ãã
ã³ãŒãã«å ¥ãåã«ãOpenGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãçè§£ããããšãéèŠã§ãããã®ãã€ãã©ã€ã³ã¯ã3Dã¢ãã«ãç»é¢ã«è¡šç€ºããã2Dç»åã«å€æããäžé£ã®æäœãèšè¿°ããŸãã以äžã«ç°¡ç¥åããæŠèŠã瀺ããŸãã
- é ç¹ããŒã¿ïŒ 3Dã¢ãã«ã®ãžãªã¡ããªãèšè¿°ããçããŒã¿ïŒé ç¹ãæ³ç·ããã¯ã¹ãã£åº§æšïŒã
- é ç¹ã·ã§ãŒããŒïŒ åé ç¹ãåŠçããéåžžã¯äœçœ®ã倿ããæ³ç·ããã¯ã¹ãã£åº§æšãªã©ã®ä»ã®å±æ§ããã¥ãŒç©ºéã§èšç®ããŸãã
- ããªããã£ãã¢ã»ã³ããªïŒ é ç¹ãäžè§åœ¢ãç·ãªã©ã®ããªããã£ãã«ã°ã«ãŒãåããŸãã
- ãžãªã¡ããªã·ã§ãŒã㌠(ãªãã·ã§ã³)ïŒ ããªããã£ãå šäœãåŠçããæ°ãããžãªã¡ããªãåçã«çæã§ããŸã (ããŸãäžè¬çã§ã¯ãããŸãã)ã
- ã©ã¹ã¿ã©ã€ãºïŒ ããªããã£ãããã©ã°ã¡ã³ã (æœåšçãªãã¯ã»ã«) ã«å€æããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒïŒ ã©ã€ãã£ã³ã°ããã¯ã¹ãã£ããã®ä»ã®èŠèŠå¹æãªã©ã®èŠçŽ ãèæ ®ããŠãåãã©ã°ã¡ã³ãã®æçµçãªè²ã決å®ããŸãã
- ãã¹ããšãã¬ã³ãïŒ æ·±åºŠãã¹ãããã¬ã³ããªã©ã®ãã¹ããå®è¡ããŠãã©ã®ãã©ã°ã¡ã³ãã衚瀺ãããããæ¢åã®ãã¬ãŒã ãããã¡ãšã©ã®ããã«çµã¿åãããããæ±ºå®ããŸãã
- ãã¬ãŒã ãããã¡ïŒ ç»é¢ã«è¡šç€ºãããæçµçãªç»åã
GLSLïŒã·ã§ãŒããŒèšèª
ã·ã§ãŒããŒã¯ãGLSL (OpenGL Shading Language) ãšåŒã°ããç¹æ®ãªèšèªã§èšè¿°ãããŸããGLSLã¯ãGPUã§ã®äžŠåå®è¡ã®ããã«èšèšãããCã©ã€ã¯ãªèšèªã§ããè¡å倿ããã¯ãã«èšç®ããã¯ã¹ãã£ãµã³ããªã³ã°ãªã©ãäžè¬çãªã°ã©ãã£ãã¯ã¹æäœãå®è¡ããããã®çµã¿èŸŒã¿é¢æ°ãæäŸããŸãã
éçºç°å¢ã®èšå®
ã³ãŒãã£ã³ã°ãéå§ããåã«ãå¿ èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
- PythonïŒ Python 3.6以éãã€ã³ã¹ããŒã«ãããŠããããšã確èªããŠãã ããã
- PyOpenGLïŒ pipã䜿çšããŠã€ã³ã¹ããŒã«ããŸãïŒ
pip install PyOpenGL PyOpenGL_accelerate - GLFWïŒ GLFWã¯ããŠã£ã³ããŠã®äœæãšå
¥åïŒããŠã¹ãšããŒããŒãïŒã®åŠçã«äœ¿çšãããŸããpipã䜿çšããŠã€ã³ã¹ããŒã«ããŸãïŒ
pip install glfw - NumPyïŒ å¹ççãªé
åæäœã®ããã«NumPyãã€ã³ã¹ããŒã«ããŸãïŒ
pip install numpy
ç°¡åãªäŸïŒè²ã®ä»ããäžè§åœ¢
ã·ã§ãŒããŒã䜿çšããŠè²ã®ä»ããäžè§åœ¢ãã¬ã³ããªã³ã°ããç°¡åãªäŸãäœæããŠã¿ãŸããããããã¯ãã·ã§ãŒããŒããã°ã©ãã³ã°ã«é¢ããåºæ¬çãªæé ã瀺ããŠããŸãã
1. é ç¹ã·ã§ãŒã㌠(vertex_shader.glsl)
ãã®ã·ã§ãŒããŒã¯ãé ç¹äœçœ®ããªããžã§ã¯ã空éããã¯ãªãã空éã«å€æããŸãã
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos, 1.0);
ourColor = aColor;
}
2. ãã©ã°ã¡ã³ãã·ã§ãŒã㌠(fragment_shader.glsl)
ãã®ã·ã§ãŒããŒã¯ãåãã©ã°ã¡ã³ãã®è²ã決å®ããŸãã
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
void main()
{
FragColor = vec4(ourColor, 1.0);
}
3. Python ã³ãŒã (main.py)
import glfw
from OpenGL.GL import *
import numpy as np
import glm # Requires: pip install PyGLM
def compile_shader(type, source):
shader = glCreateShader(type)
glShaderSource(shader, source)
glCompileShader(shader)
if not glGetShaderiv(shader, GL_COMPILE_STATUS):
raise Exception("Shader compilation failed: %s" % glGetShaderInfoLog(shader))
return shader
def create_program(vertex_source, fragment_source):
vertex_shader = compile_shader(GL_VERTEX_SHADER, vertex_source)
fragment_shader = compile_shader(GL_FRAGMENT_SHADER, fragment_source)
program = glCreateProgram()
glAttachShader(program, vertex_shader)
glAttachShader(program, fragment_shader)
glLinkProgram(program)
if not glGetProgramiv(program, GL_LINK_STATUS):
raise Exception("Program linking failed: %s" % glGetProgramInfoLog(program))
glDeleteShader(vertex_shader)
glDeleteShader(fragment_shader)
return program
def main():
if not glfw.init():
return
glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 3)
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE)
width, height = 800, 600
window = glfw.create_window(width, height, "Colored Triangle", None, None)
if not window:
glfw.terminate()
return
glfw.make_context_current(window)
glfw.set_framebuffer_size_callback(window, framebuffer_size_callback)
# Load shaders
with open("vertex_shader.glsl", "r") as f:
vertex_shader_source = f.read()
with open("fragment_shader.glsl", "r") as f:
fragment_shader_source = f.read()
shader_program = create_program(vertex_shader_source, fragment_shader_source)
# Vertex data
vertices = np.array([
-0.5, -0.5, 0.0, 1.0, 0.0, 0.0, # Bottom Left, Red
0.5, -0.5, 0.0, 0.0, 1.0, 0.0, # Bottom Right, Green
0.0, 0.5, 0.0, 0.0, 0.0, 1.0 # Top, Blue
], dtype=np.float32)
# Create VAO and VBO
VAO = glGenVertexArrays(1)
VBO = glGenBuffers(1)
glBindVertexArray(VAO)
glBindBuffer(GL_ARRAY_BUFFER, VBO)
glBufferData(GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL_STATIC_DRAW)
# Position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * vertices.itemsize, ctypes.c_void_p(0))
glEnableVertexAttribArray(0)
# Color attribute
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * vertices.itemsize, ctypes.c_void_p(3 * vertices.itemsize))
glEnableVertexAttribArray(1)
# Unbind VAO
glBindBuffer(GL_ARRAY_BUFFER, 0)
glBindVertexArray(0)
# Transformation matrix
transform = glm.mat4(1.0) # Identity matrix
# Rotate the triangle
transform = glm.rotate(transform, glm.radians(45.0), glm.vec3(0.0, 0.0, 1.0))
# Get the uniform location
transform_loc = glGetUniformLocation(shader_program, "transform")
# Render loop
while not glfw.window_should_close(window):
glClearColor(0.2, 0.3, 0.3, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
# Use the shader program
glUseProgram(shader_program)
# Set the uniform value
glUniformMatrix4fv(transform_loc, 1, GL_FALSE, glm.value_ptr(transform))
# Bind VAO
glBindVertexArray(VAO)
# Draw the triangle
glDrawArrays(GL_TRIANGLES, 0, 3)
# Swap buffers and poll events
glfw.swap_buffers(window)
glfw.poll_events()
# Cleanup
glDeleteVertexArrays(1, (VAO,))
glDeleteBuffers(1, (VBO,))
glDeleteProgram(shader_program)
glfw.terminate()
def framebuffer_size_callback(window, width, height):
glViewport(0, 0, width, height)
if __name__ == "__main__":
main()
説æïŒ
- ã³ãŒãã¯GLFWãåæåããOpenGLãŠã£ã³ããŠãäœæããŸãã
- é ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã®ãœãŒã¹ã³ãŒããããããã®ãã¡ã€ã«ããèªã¿èŸŒã¿ãŸãã
- ã·ã§ãŒããŒãã³ã³ãã€ã«ããã·ã§ãŒããŒããã°ã©ã ã«ãªã³ã¯ããŸãã
- äœçœ®ãšè²æ å ±ãå«ããäžè§åœ¢ã®é ç¹ããŒã¿ãå®çŸ©ããŸãã
- é ç¹ããŒã¿çšã®é ç¹é åãªããžã§ã¯ã (VAO) ãšé ç¹ãããã¡ãªããžã§ã¯ã (VBO) ãäœæããŸãã
- OpenGLã«é ç¹ããŒã¿ãè§£éããæ¹æ³ãæç€ºããããã«ãé ç¹å±æ§ãã€ã³ã¿ãèšå®ããŸãã
- ã¬ã³ããªã³ã°ã«ãŒãã«å ¥ããç»é¢ãã¯ãªã¢ããã·ã§ãŒããŒããã°ã©ã ã䜿çšããVAOããã€ã³ãããäžè§åœ¢ãæç»ãããããã¡ã亀æããŠçµæã衚瀺ããŸãã
- `framebuffer_size_callback` 颿°ã䜿çšããŠããŠã£ã³ããŠã®ãµã€ãºå€æŽãåŠçããŸãã
- ããã°ã©ã ã¯ã`glm` ã©ã€ãã©ãªã䜿çšããŠå®è£ ããã倿è¡åã䜿çšããŠäžè§åœ¢ãå転ããããããåäžãªå€æ°ãšããŠé ç¹ã·ã§ãŒããŒã«æž¡ããŸãã
- æåŸã«ãçµäºåã«OpenGLãªãœãŒã¹ãã¯ãªãŒã³ã¢ããããŸãã
é ç¹å±æ§ãšåäžå€æ°ãçè§£ãã
äžèšã®äŸã§ã¯ãé ç¹å±æ§ãšåäžå€æ°ã®äœ¿çšã«æ°ã¥ãã§ãããããããã¯ãã·ã§ãŒããŒããã°ã©ãã³ã°ã«ãããéèŠãªæŠå¿µã§ãã
- é ç¹å±æ§ïŒ ãããã¯é ç¹ã·ã§ãŒããŒãžã®å ¥åã§ããäœçœ®ãæ³ç·ããã¯ã¹ãã£åº§æšãè²ãªã©ãåé ç¹ã«é¢é£ä»ããããããŒã¿ã衚ããŸããäŸã§ã¯ã`aPos` (äœçœ®) ãš `aColor` (è²) ãé ç¹å±æ§ã§ãã
- åäžå€æ°ïŒ ãããã¯ãé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã®äž¡æ¹ããã¢ã¯ã»ã¹ã§ããã°ããŒãã«å€æ°ã§ãããããã¯éåžžã倿è¡åãã©ã€ãã£ã³ã°ãã©ã¡ãŒã¿ããã¯ã¹ãã£ãµã³ãã©ãŒãªã©ãç¹å®ã®æç»åŒã³åºãã«å¯ŸããŠäžå®ã§ããããŒã¿ãæž¡ãããã«äœ¿çšãããŸããäŸã§ã¯ã`transform` ã¯å€æè¡åãä¿æããåäžå€æ°ã§ãã
ãã¯ã¹ãã£ãªã³ã°ïŒèŠèŠçãªè©³çްã®è¿œå
ãã¯ã¹ãã£ãªã³ã°ã¯ã3Dã¢ãã«ã«èŠèŠçãªè©³çްã远å ããããã«äœ¿çšãããææ³ã§ãããã¯ã¹ãã£ã¯ãã¢ãã«ã®è¡šé¢ã«ãããã³ã°ãããåãªãç»åã§ããã·ã§ãŒããŒã¯ããã¯ã¹ãã£ããµã³ããªã³ã°ãããã¯ã¹ãã£åº§æšã«åºã¥ããŠåãã©ã°ã¡ã³ãã®è²ã決å®ããããã«äœ¿çšãããŸãã
ãã¯ã¹ãã£ãªã³ã°ãå®è£ ããã«ã¯ã以äžãå¿ èŠã§ãã
- Pillow (PIL) ãªã©ã®ã©ã€ãã©ãªã䜿çšããŠããã¯ã¹ãã£ç»åãèªã¿èŸŒã¿ãŸãã
- OpenGLãã¯ã¹ãã£ãªããžã§ã¯ããäœæããç»åããŒã¿ãGPUã«ã¢ããããŒãããŸãã
- é ç¹ã·ã§ãŒããŒã倿ŽããŠããã¯ã¹ãã£åº§æšããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒã倿ŽããŠããã¯ã¹ãã£åº§æšã䜿çšããŠãã¯ã¹ãã£ããµã³ããªã³ã°ããçµæã®è²ããã©ã°ã¡ã³ãã«é©çšããŸãã
äŸïŒãã¥ãŒãã«ãã¯ã¹ãã£ã远å ãã
ãã¥ãŒãã«ãã¯ã¹ãã£ãé©çšããç°¡ç¥åãããäŸ (ã³ãŒãã¯é·ãã®å¶çŽã«ããããã«ã¯ç€ºãããŠããŸããããæŠå¿µã¯èª¬æãããŠããŸã) ãèããŠã¿ãŸããããé ç¹ã·ã§ãŒããŒã«ã¯ããã¯ã¹ãã£åº§æšã® `in` 倿°ãšããããããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ã `out` 倿°ãå«ãŸããŸãããã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ã`texture()` 颿°ã䜿çšããŠãæå®ããã座æšã§ãã¯ã¹ãã£ããµã³ããªã³ã°ããçµæã®è²ã䜿çšããŸãã
ã©ã€ãã£ã³ã°ïŒçŸå®çãªç §æã®äœæ
ã©ã€ãã£ã³ã°ã¯ã3Dã°ã©ãã£ãã¯ã¹ã®ãã1ã€ã®éèŠãªåŽé¢ã§ããã·ã§ãŒããŒã䜿çšãããšã次ã®ãããªããŸããŸãªã©ã€ãã£ã³ã°ã¢ãã«ãå®è£ ã§ããŸãã
- ç°å¢å ïŒ ãã¹ãŠã®è¡šé¢ã«åçã«åœ±é¿ãäžããäžå®ã®åäžãªç §æã
- æ¡æ£å ïŒ å æºãšè¡šé¢æ³ç·ãšã®è§åºŠã«äŸåããç §æã
- é¡é¢å ïŒ å ãçŽæ¥èŠèŽè ã®ç®ã«åå°ãããšãã«ãå æ²¢ã®ãã衚é¢ã«çŸãããã€ã©ã€ãã
ã©ã€ãã£ã³ã°ãå®è£ ããã«ã¯ã以äžãå¿ èŠã§ãã
- åé ç¹ã®è¡šé¢æ³ç·ãèšç®ããŸãã
- å æºã®äœçœ®ãšè²ãåäžå€æ°ãšããŠã·ã§ãŒããŒã«æž¡ããŸãã
- é ç¹ã·ã§ãŒããŒã§ãé ç¹äœçœ®ãšæ³ç·ããã¥ãŒç©ºéã«å€æããŸãã
- ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§ãã©ã€ãã£ã³ã°ã®ç°å¢ãæ¡æ£ãé¡é¢æåãèšç®ããããããçµã¿åãããŠæçµçãªè²ã決å®ããŸãã
äŸïŒåºæ¬çãªã©ã€ãã£ã³ã°ã¢ãã«ã®å®è£
ïŒããã§ããå®å šãªã³ãŒãã§ã¯ãªãæŠå¿µçãªèª¬æã§ããïŒåçŽãªæ¡æ£ã©ã€ãã£ã³ã°ã¢ãã«ãå®è£ ããããšãæ³åããŠãã ããããã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ãæ£èŠåãããå ã®æ¹åãšæ£èŠåãããè¡šé¢æ³ç·ãšã®ãããç©ãèšç®ããŸãããããç©ã®çµæã¯ãå ã®è²ãã¹ã±ãŒãªã³ã°ããããã«äœ¿çšãããå ã«çŽæ¥é¢ããŠãã衚é¢ã«ã¯æããè²ãå察åŽã®è¡šé¢ã«ã¯æãè²ãäœæãããŸãã
é«åºŠãªã·ã§ãŒããŒæè¡
åºæ¬ããã£ãããšçè§£ããããæ¬¡ã®ãããªããé«åºŠãªã·ã§ãŒããŒæè¡ãæ¢çŽ¢ã§ããŸãã
- æ³ç·ãããã³ã°ïŒ æ³ç·ããããã¯ã¹ãã£ã䜿çšããŠãé«è§£å床ã®è¡šé¢ã®è©³çްãã·ãã¥ã¬ãŒãããŸãã
- ã·ã£ããŠãããã³ã°ïŒ å æºã®èŠç¹ããã·ãŒã³ãã¬ã³ããªã³ã°ããŠã·ã£ããŠãäœæããŸãã
- ãã¹ãããã»ã¹å¹æïŒ ãŒãããè²è£æ£ããã«ãŒã ãªã©ãã¬ã³ããªã³ã°ãããç»åå šäœã«å¹æãé©çšããŸãã
- ã³ã³ãã¥ãŒãã·ã§ãŒããŒïŒ GPUãæ±çšèšç®ã«äœ¿çšããŸãïŒç©çã·ãã¥ã¬ãŒã·ã§ã³ãããŒãã£ã¯ã«ã·ã¹ãã ãªã©ïŒã
- ãžãªã¡ããªã·ã§ãŒããŒïŒ å ¥åããªããã£ãã«åºã¥ããŠæ°ãããžãªã¡ããªãæäœãŸãã¯çæããŸãã
- ããã»ã¬ãŒã·ã§ã³ã·ã§ãŒããŒïŒ ããæ»ãããªæ²ç·ãšãã詳现ãªãžãªã¡ããªã®ããã«ããµãŒãã§ã¹ã现ååããŸãã
ã·ã§ãŒããŒã®ãããã°
ã·ã§ãŒããŒã¯GPUäžã§å®è¡ãããåŸæ¥ã®ãããã°ããŒã«ãæäŸããªããããã·ã§ãŒããŒã®ãããã°ã¯å°é£ãªå ŽåããããŸãããã ããããã€ãã®ææ³ã䜿çšã§ããŸãã
- ãšã©ãŒã¡ãã»ãŒãžïŒ ã·ã§ãŒããŒã®ã³ã³ãã€ã«ãŸãã¯ãªã³ã¯æã«OpenGLãã©ã€ããŒã«ãã£ãŠçæããããšã©ãŒã¡ãã»ãŒãžãæ³šææ·±ã調ã¹ãŸãããããã®ã¡ãã»ãŒãžã¯ãæ§æãšã©ãŒããã®ä»ã®åé¡ã«é¢ãããã³ããå€ãã®å ŽåæäŸããŸãã
- å€ã®åºåïŒ ãã©ã°ã¡ã³ãã®è²ã«å€ãå²ãåœãŠãããšã«ãããäžéå€ãã·ã§ãŒããŒããç»é¢ã«åºåããŸããããã«ãããèšç®ã®çµæãèŠèŠåããæœåšçãªåé¡ãç¹å®ã§ããŸãã
- ã°ã©ãã£ãã¯ã¹ãããã¬ãŒïŒ RenderDoc ã NSight Graphics ãªã©ã®ã°ã©ãã£ãã¯ã¹ãããã¬ãŒã䜿çšããŠãã·ã§ãŒããŒãã¹ãããå®è¡ããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã®å段éã§å€æ°ã®å€ãæ€æ»ããŸãã
- ã·ã§ãŒããŒã®ç°¡çŽ åïŒ åé¡ã®åå ãåé¢ããããã«ãã·ã§ãŒããŒã®äžéšã段éçã«åé€ããŸãã
ã·ã§ãŒããŒããã°ã©ãã³ã°ã®ãã¹ããã©ã¯ãã£ã¹
ã·ã§ãŒããŒãèšè¿°ããéã«å¿ã«çããŠããã¹ããã¹ããã©ã¯ãã£ã¹ã次ã«ç€ºããŸãã
- ã·ã§ãŒããŒãçããã·ã³ãã«ã«ä¿ã€ïŒ è€éãªã·ã§ãŒããŒã¯ããããã°ãšæé©åãå°é£ã«ãªãå¯èœæ§ããããŸããè€éãªèšç®ããããå°ããããã管çãããã颿°ã«åå²ããŸãã
- åå²ãé¿ããïŒ åå² (if æ) ã¯ãGPUã®ããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ããããŸããå¯èœãªå Žåã¯åžžã«ããã¯ãã«æŒç®ããã®ä»ã®ææ³ã䜿çšããŠåå²ãåé¿ããŠã¿ãŠãã ããã
- åäžå€æ°ãè³¢ã䜿çšããïŒ äœ¿çšããåäžå€æ°ã®æ°ãæå°éã«æãããšãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãããã¯ã¹ãã£ã«ãã¯ã¢ããããã®ä»ã®ææ³ã䜿çšããŠãããŒã¿ãã·ã§ãŒããŒã«æž¡ãããšãæ€èšããŠãã ããã
- ã¿ãŒã²ããããŒããŠã§ã¢ã«åãããŠæé©åããïŒ GPUã«ãã£ãŠããã©ãŒãã³ã¹ç¹æ§ãç°ãªããŸããã¿ãŒã²ãããšããç¹å®ã®ããŒããŠã§ã¢ã«åãããŠã·ã§ãŒããŒãæé©åããŸãã
- ã·ã§ãŒããŒããããã¡ã€ã«ããïŒ ã°ã©ãã£ãã¯ã¹ãããã¡ã€ã©ãŒã䜿çšããŠãã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
- ã³ãŒãã«ã³ã¡ã³ããä»ããïŒ ã·ã§ãŒããŒã®åäœã説æããæç¢ºã§ç°¡æœãªã³ã¡ã³ããèšè¿°ããŸããããã«ãããã³ãŒãã®ãããã°ãšä¿å®ã容æã«ãªããŸãã
詳现ã«ã€ããŠã¯ããªãœãŒã¹
- OpenGLããã°ã©ãã³ã°ã¬ã€ã (ã¬ããããã¯)ïŒ OpenGLã«é¢ããå æ¬çãªãªãã¡ã¬ã³ã¹ã
- OpenGLã·ã§ãŒãã£ã³ã°èšèª (ãªã¬ã³ãžããã¯)ïŒ GLSLã®è©³çްãªã¬ã€ãã
- LearnOpenGLïŒ å¹ åºãOpenGLã®ãããã¯ãã«ããŒããåªãããªã³ã©ã€ã³ãã¥ãŒããªã¢ã«ã(learnopengl.com)
- OpenGL.orgïŒ å ¬åŒã®OpenGL Webãµã€ãã
- Khronos GroupïŒ OpenGLæšæºãéçºããã³ä¿å®ããçµç¹ã(khronos.org)
- PyOpenGLããã¥ã¡ã³ãïŒ PyOpenGLã®å ¬åŒããã¥ã¡ã³ãã
çµè«
Pythonã䜿ã£ãOpenGLã·ã§ãŒããŒããã°ã©ãã³ã°ã¯ãçŽ æŽããã3Dã°ã©ãã£ãã¯ã¹ãäœæããããã®å¯èœæ§ã®äžçãåãéããŸããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãçè§£ããGLSLãç¿åŸãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãäœãå¯èœãã®éçãæŒãäžããã«ã¹ã¿ã èŠèŠå¹æãšã€ã³ã¿ã©ã¯ãã£ããªãšã¯ã¹ããªãšã³ã¹ãäœæã§ããŸãããã®ã¬ã€ãã¯ã3Dã°ã©ãã£ãã¯ã¹éçºãžã®æ ã®ããã®ç¢ºåºããåºç€ãæäŸããŸããå®éšããæ¢çŽ¢ããæ¥œããã§ãã ããïŒ